package binarySystem;

import org.junit.Test;

/**
 * 功能描述:bit操作
 * 2024/07/04
 *
 * @author ZhangYi
 */
public class BitOperation {

    /**
     * 测试 按位与 &
     * 例如：5 & 3 结果为 1 （二进制表示：5 是 0101，3 是 0011，按位与后得到 0001）。
     * @author ZhangYi
     */
    @Test
    public void testBitAnd(){
        System.out.println("执行 铵位与 & 的结果如下,必须同时为1 才会为1");
        System.out.println(String.format("  1 & 1 按位与的结果为 %d", 1 & 1));
        System.out.println(String.format("  1 & 1 & 1 按位与的结果为 %d", 1 & 1 & 1));
        System.out.println(String.format("  1 & 0 按位与的结果为 %d", 1 & 0));
        System.out.println(String.format("  0 & 1 按位与的结果为 %d", 0 & 1));
        System.out.println(String.format("  0 & 0 & 1 按位与的结果为 %d", 0 & 0 & 1));


        try {
            // 不带有短路的特性, 所以这里会报错, 引发空指针异常
            String s = null;
            System.out.println(s != null & s.length()>0);
        } catch (NullPointerException e) {
            throw new RuntimeException("没有短路特性, 每一个表达式都要执行,所以出现了 空指针异常了 ");
        }
    }

    /**
     * 测试 按位或 |
     *例如：5 | 3 结果为 7 （二进制表示：5 是 0101，3 是 0011，按位或后得到 0111）。
     * @author ZhangYi
     */
    @Test
    public void testBitOr(){
        System.out.println("执行 按位或 | 的结果如下,只要有一个为1 就为1");
        System.out.println(String.format("  1 | 1 按位或的结果为 %d", 1 | 1));
        System.out.println(String.format("  1 | 1 | 1 按位或的结果为 %d", 1 | 1 | 1));
        System.out.println(String.format("  1 | 0 按位或的结果为 %d", 1 | 0));
        System.out.println(String.format("  0 | 1 按位或的结果为 %d", 0 | 1));

        try {
            String s = null;
            System.out.println(s != null | s.length()>0);
        } catch (Exception e) {
            throw new RuntimeException("没有短路特性, 每一个表达式都要执行,所以出现了 空指针异常了 ");
        }
    }

    /**
     * 测试 位异或 ^
     * 例如：5 ^ 3 结果为 6 （二进制表示：5 是 0101，3 是 0011，按位异或后得到 0110）。
     * @author ZhangYi
     */
    @Test
    public void testBitXor(){
        System.out.println("执行 按位异或 ^ 的结果如下, 相同为0, 不同为1");
        System.out.println(String.format("  1 ^ 1 按位异或的结果为 %d", 1 ^ 1));
        System.out.println(String.format("  1 ^ 1 ^ 1 按位异或的结果为 %d", 1 ^ 1 ^ 1));
        System.out.println(String.format("  1 ^ 0 按位异或的结果为 %d", 1 ^ 0));
        System.out.println(String.format("  0 ^ 1 按位异或的结果为 %d", 0 ^ 1));
        try {
            String s = null;
            System.out.println(s != null ^ s.length()>0);
        }catch (Exception e){
            throw new RuntimeException("没有短路特性, 每一个表达式都要执行,所以出现了 空指针异常了 ");
        }
    }

    /**
     * 测试 按位反
     * 注意：由于~操作符作用于整数，其结果通常会包含符号位的改变，可能导致负数。例如，~5 结果为 -6
     * （二进制表示：5 是 0101，取反后得到 1010，作为有符号整数解释为 -6）。
     * @author ZhangYi
     */
    @Test
    public void testBitNot(){
        System.out.println("执行 按位非(按位取反) ~ 的结果如下, 相反");
        System.out.println(String.format("  ~1 按位非的结果为 %d", ~1));
        System.out.println(String.format("  ~0 按位非的结果为 %d", ~0));
        System.out.println(String.format("  ~-1 按位非的结果为 %d", ~-1));
        System.out.println(String.format("  ~-2 按位非的结果为 %d", ~-2));
    }
}
